package co.yixiang.modules.tools.express.config;

import co.yixiang.constant.ShopConstants;
import co.yixiang.enums.ShopCommonEnum;
import co.yixiang.modules.tools.express.ExpressService;
import co.yixiang.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

/**
 * 快递配置自动配置类
 * <p>
 * 该类负责在应用启动时，自动配置快递服务的相关信息
 * 它通过读取Redis中的配置来初始化快递服务对象
 * </p>
 *
 * @Configuration 注解表明这是一个配置类，用于自动配置快递服务
 * @proxyBeanMethods(false) 表示不代理Bean的方法，以提高性能
 */
@Configuration(proxyBeanMethods = false)
public class ExpressAutoConfiguration {

    /**
     * Redis工具类的静态实例，用于访问Redis中的数据
     */
    private static RedisUtils redisUtil;

    /**
     * 构造函数注入RedisUtils实例
     *
     * @param redisUtil Redis工具类实例，用于操作Redis数据库
     * @Autowired 注解表明这是一个Spring自动注入的构造函数
     */
    @Autowired
    public ExpressAutoConfiguration(RedisUtils redisUtil) {
        ExpressAutoConfiguration.redisUtil = redisUtil;
    }

    /**
     * 获取快递服务实例
     *
     * 该方法首先尝试从Redis中获取已经配置好的快递服务实例
     * 如果获取失败，则根据Redis中的配置信息创建一个新的快递服务实例
     * 并将其存入Redis中以供后续使用
     *
     * @return ExpressService 快递服务实例
     */
    public static ExpressService expressService() {
        // 尝试从Redis中获取快递服务实例
        ExpressService expressService = (ExpressService) redisUtil.get(ShopConstants.YSHOP_EXPRESS_SERVICE);
        if (expressService != null) {
            // 如果实例存在，直接返回
            return expressService;
        }

        // 创建新的快递服务配置
        ExpressProperties properties = new ExpressProperties();
        // 从Redis中获取快递服务的配置信息
        String enable = redisUtil.getY("exp_enable");
        String appId = redisUtil.getY("exp_appId");
        String appKey = redisUtil.getY("exp_appKey");
        // 设置快递服务的AppId和AppKey
        properties.setAppId(appId);
        properties.setAppKey(appKey);

        // 根据配置信息设置快递服务是否启用
        if (ShopCommonEnum.ENABLE_2.getValue().toString().equals(enable)) {
            properties.setEnable(false);
        } else {
            properties.setEnable(true);
        }

        // 创建并配置快递服务实例
        ExpressService service = new ExpressService();
        service.setProperties(properties);

        // 将配置好的快递服务实例存入Redis中
        redisUtil.set(ShopConstants.YSHOP_EXPRESS_SERVICE, service);

        // 返回配置好的快递服务实例
        return service;
    }

}
